home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / src / promise.c < prev    next >
C/C++ Source or Header  |  1992-10-09  |  837b  |  42 lines

  1. /* Delay and force
  2.  */
  3.  
  4. #include "scheme.h"
  5.  
  6. Object P_Promisep (x) Object x; {
  7.     return TYPE(x) == T_Promise ? True : False;
  8. }
  9.  
  10. Object P_Delay (argl) Object argl; {
  11.     Object d;
  12.     GC_Node;
  13.  
  14.     GC_Link (argl);
  15.     d = Alloc_Object (sizeof (struct S_Promise), T_Promise, 0);
  16.     GC_Unlink;
  17.     PROMISE(d)->done = 0;
  18.     PROMISE(d)->env = The_Environment;
  19.     PROMISE(d)->thunk = Car (argl);
  20.     return d;
  21. }
  22.  
  23. Object P_Force (d) Object d; {
  24.     Object ret, a[2];
  25.     GC_Node;
  26.  
  27.     Check_Type (d, T_Promise);
  28.     if (PROMISE(d)->done)
  29.     return PROMISE(d)->thunk;
  30.     GC_Link (d);
  31.     a[0] = PROMISE(d)->thunk; a[1] = PROMISE(d)->env;
  32.     ret = P_Eval (2, a);
  33.     GC_Unlink;
  34.     PROMISE(d)->done = 1;
  35.     return PROMISE(d)->thunk = ret;
  36. }
  37.  
  38. Object P_Promise_Env (p) Object p; {
  39.     Check_Type (p, T_Promise);
  40.     return PROMISE(p)->env;
  41. }
  42.